<?php
/**
 * Controller de Controladores.
 *
 *
 * @filesource          
 * @copyright		
 * @link		http://www.pragmatia.com Pragmatia
 * @package		datagro
 * @subpackage	app.controllers
 * @version     1.1
 * @license		http://www.opensource.org/licenses/mit-license.php The MIT License
 * @author      Martin Radosta <mradosta@pragmatia.com>
 */

//uses('sanitize');


/**
 * Clase ControladoresController
 *
 * @package	    datagro
 * @subpackage	app.controllers
 */

class ControladoresController extends AppController {
	var $name = 'Controladores';
	var $uses = array("Controlador", "Dominio");

/**
 * Index.
 *
 */
    function index() {
		if(!empty($this->data)) {
			$condicion = $this->Filtro->generarCondicion($this->data['Filtro']);
			$this->paginate['conditions'] = $condicion;
		}

		$this->set('estados_seguridad', $this->Dominio->generateList(array("nombre"=>"estados_seguridad"), null, null, null, "{n}.Dominio.valor"));	
        $this->set('registros', $this->paginate());
    }


/**
 * View.
 *
 */
   function view($id = false) {
        if ($id && is_numeric($id)) {
			$this->set('estados_seguridad', $this->Dominio->generateList(array("nombre"=>"estados_seguridad"), null, null, null, "{n}.Dominio.valor"));	
            $this->data = $this->Controlador->read(null, $id);
        }    
   }  


/**
 * Add.
 *
 */
   function add() 
   {
		if(!empty($this->data) && isset($this->data['Controlador']['accion']) && ($this->data['Controlador']['accion'] == "grabar" || $this->data['Controlador']['accion'] == "cancelar")) {
			if ($this->data['Controlador']['accion'] == "grabar") {
				if($this->Controlador->create($this->data) && $this->Controlador->validates()) {
					if($this->Controlador->save($this->data))
						$this->Session->setFlash('El controlador se agrego correctamente.', 'ok');
					else
						$this->Session->setFlash('No fue posible agregar el nuevo controlador.', 'error');	

					$this->redirect("index", null, true);
				}
				else {
					$this->set('estados_seguridad', $this->Dominio->generateList(array("nombre"=>"estados_seguridad"), null, null, null, "{n}.Dominio.valor"));	
				}
			}
			elseif ($this->data['Controlador']['accion'] == "cancelar") {
				$this->redirect("index", null, true);
			}
		}
		else {
			$this->set('estados_seguridad', $this->Dominio->generateList(array("nombre"=>"estados_seguridad"), null, null, null, "{n}.Dominio.valor"));	
		}
   }   


/**
 * Edit.
 *
 */
   function edit($id) 
   {
		if(!empty($this->data) && isset($this->data['Controlador']['accion']) && ($this->data['Controlador']['accion'] == "grabar" || $this->data['Controlador']['accion'] == "cancelar")) {
			if ($this->data['Controlador']['accion'] == "grabar") {
				if($this->Controlador->create($this->data) && $this->Controlador->validates()) {
					if($this->Controlador->save($this->data))
						$this->Session->setFlash('El controlador se actualizo correctamente.', 'ok');
					else
						$this->Session->setFlash('No fue posible actualizar el controlador.', 'error');	

					$this->redirect("index", null, true);
				}
				else {
					$this->set('estados_seguridad', $this->Dominio->generateList(array("nombre"=>"estados_seguridad"), null, null, null, "{n}.Dominio.valor"));	
					$this->render('add');
				}
			}
			elseif ($this->data['Controlador']['accion'] == "cancelar") {
				$this->redirect("index", null, true);
			}
		}
		else {
			$this->data = $this->Controlador->read(null, $id);
			$this->set('estados_seguridad', $this->Dominio->generateList(array("nombre"=>"estados_seguridad"), null, null, null, "{n}.Dominio.valor"));	
			$this->render('add');
		}
   }    


/**
 * Cargar controladores.
 *
 */
    function cargaMasiva()
    {
			$controladoresACargar = $this->_getCakeControllers(APP);
			d($controladoresACargar);
			/*
			$aplicacion = $this->Controlador->Aplicacion->findById($this->params['data']['Aplicacion']['aplicacion_id']);
			$tmp = $this->Controlador->findAll(null, "Controlador.con_nombre");
			$controladores = array();
			foreach($tmp as $tabla)
			{
				$controladores[] = Inflector::camelize(strtolower($tabla['Controlador']['con_nombre']));
			}
			$controladoresCargadas = $this->_getCakeControllers($aplicacion['Aplicacion']['apl_directorio']);
			$controladoresACargar = array_diff($controladoresCargadas, $controladores);
			*/
			$dominio_id = dominio("estados_seguridad", "Activo");
			foreach($controladoresACargar as $v) {
				$save = array("Controlador"=>array("nombre"=>$v, "estado"=>$dominio_id));
				$this->Controlador->create();
				$this->Controlador->save($save);
				$controlador_id = $this->Controlador->getLastInsertId();
				$acciones = $this->_getCakeControllerMethods($aplicacion['Aplicacion']['apl_directorio'], $v);
				foreach($acciones as $accion)
				{
					//no cargo las acciones privadas
					if(substr($accion, 0, 1) <> "_") 
					{
						$this->Controlador->Accion->save(array("Accion"=>array("id"=>"", "acc_nombre"=>$accion, "acc_descripcion"=>$accion, "controlador_id"=>$controlador_id)));
					}
				}
			}
			$this->redirect('/controladores/index');
    }

	function _getCakeControllers($directorio)
	{
		$controllers = array();
		$controllerList = listClasses($directorio . "controllers");
		foreach($controllerList AS $controller => $file) {
			list($name) = explode('.',$file);
			$controllerName = Inflector::camelize(str_replace('_controller','',$name));
			$controllers[] = $controllerName;
		}
		if(!empty($controllers)) {
			return $controllers;
		}
		else {
			return false;
		}
	}

    function _getCakeControllerMethods($directorio, $controllerName)
    {
            $file = $directorio . "controllers" . DS . Inflector::underscore($controllerName)."_controller.php";
            if (file_exists($file))
            {
                require_once($file);
                $parentClassMethods = get_class_methods('AppController');
                $subClassMethods = get_class_methods($controllerName.'Controller');
                $classMethods = array_diff($subClassMethods, $parentClassMethods);
                $subClassVars = false;
                $subClassVars = get_class_vars($controllerName.'Controller');
                if(in_array('scaffold', array_keys($subClassVars)))
                {
                        $scaffold_file = CAKE."libs".DS."controller".DS."scaffold.php";			
                        require_once($scaffold_file);			
                        $scaffoldClassMethods = get_class_methods("Scaffold");			
                        $scaffoldMethods = array_diff($scaffoldClassMethods, $parentClassMethods);
                        foreach($scaffoldMethods AS $sMethod)
                        {
                                $classMethods[] = $sMethod;
                        }
                }
                
                return $classMethods;
            }
            else
            {
                return false;
            }
    }


}
?>